package cn.school.telephone.utils;

//import com.shomr.pk.gate_sch_in_out_server.tools.DateTools;

import lombok.extern.slf4j.Slf4j;

import java.security.MessageDigest;
import java.text.SimpleDateFormat;
import java.util.Date;

@Slf4j
public class Md5TokenUtil {

//
//    简易版 slat_md5 版本
//    双发约定 使用一个 slat_str 双方自定义 可以双方一致 也可以不一致双方协商
//    生成规则:1.  agentId.标准的yyyyMMddHHmmss时间.slat_str  进行标准 32位md5运算 得到 md5_str
//              2.  将 agentId|yyyyMMddHHmmss|md5_str 拼接然后  得到token
//    demo:  agentId:17   时间戳:20230610142635  slat_str:slat_TEST_now
//    第一步拼接: 17.20230610142635.slat_TEST_now
//    计算相应的 md5_str 为   8382ceabb3d2ac7dd5570d55c89ef65f
//    第二步拼接: 17|20230610142635|8382ceabb3d2ac7dd5570d55c89ef65f 得到token
//    会对 时间戳做校验  60s 内有效

    /**
     * @param agentId
     * @param slat
     * @return java.lang.String
     * @todo 1.0 生成md5的 token
     * @author znnTx
     * @time 2023-06-10 15:39
     * @method getMd5Token
     */
    public static String getMd5Token(String agentId, String slat) {
        String dealTitle = "1.0 生成md5的 token";
        try {
            SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
            String dealTime = sdf.format(new Date());
            System.out.println(dealTime);
//            String dealTime = DateTools.getToday(DateTools.pattern14);
            String md5Add = agentId + "." + dealTime + "." + slat;

            // md5加密
            MessageDigest md = MessageDigest.getInstance("MD5");
            md.update(md5Add.getBytes());
            byte[] digest = md.digest();

            // 将字节数组转换为十六进制字符串
            StringBuilder sb = new StringBuilder();
            for (byte b : digest) {
                sb.append(String.format("%02x", b & 0xff));
            }

            return agentId + "|" + dealTime + "|" + sb;
        } catch (Exception e) {
            e.printStackTrace();
            log.info("{} 出错 {}", dealTitle, e.getMessage());
            log.error("{} 出错 {}", dealTitle, e.getMessage());
        }
        return null;
    }


//    /**
//     * @param token
//     * @param slat
//     * @return boolean
//     * @todo 2.0 进行token 校验
//     * @author znnTx
//     * @time 2023-06-10 15:44
//     * @method checkMd5Token
//     */
//    public static boolean checkMd5Token(String token, String slat) {
//        String dealTitle = "2.0 进行token 校验 token:" + token + "  slat:" + slat;
//        try {
//            String[] splits = token.split("\\|");
//            if (splits.length != 3) {
//                log.info("{} md5 token 长度切分出错", dealTitle);
//                return false;
//            }
//            String agentId = splits[0];
//            String dealTime = splits[1];
//            String signStr = splits[2];
////            判定时间是否超长了
//            String endTime = DateTools.date14AddMin(dealTime, 1);
//            if (!DateTools.checkCurrentDayBetween(DateTools.getToday(DateTools.pattern14), dealTime, endTime)) {
//                log.info("{} 时间超时了", dealTitle);
//                return false;
//            }
//            String checkMd5 = agentId + "." + dealTime + "." + slat;
//            return signStr.equals(getMd5Str(checkMd5));
//        } catch (Exception e) {
//            e.printStackTrace();
//            log.info("{} 出错 {}", dealTitle, e.getMessage());
//            log.error("{} 出错 {}", dealTitle, e.getMessage());
//        }
//        return false;
//    }
//
//
//    /**
//     * @Description: TODO  引用 spring的 自带 的md5
//     * @author: znnTx
//     * @date: 2021/10/19 14:47
//     * @Parm * @param plainText:
//     * @Return: java.lang.String
//     */
//    public static String getMd5Str(String plainText) {
//        return DigestUtils.md5DigestAsHex(plainText.getBytes());
//    }
//

    public static void main(String[] args) throws InterruptedException {
//        String md5HeadStr = "17.20230610142635.slat_TEST_now";
//        String md5_str = getMd5Str(md5HeadStr);
//        System.out.println(md5_str);
//        String base64StrHead = "17.8382ceabb3d2ac7dd5570d55c89ef65f";
//        Base64.getEncoder().
//        String md5_str =
        String agentId = "110";
        String slat = "xYgQcEs20231106,+";
        String md5Token = getMd5Token(agentId, slat);
        System.out.println("md5Token:" + md5Token);

        // 110|20231106093317|afda6a4fa2ff2a84e87b7379db6af9b3
        // 52|20240323101104|2bba2be8eeb347ff095467af8a4ce06a

//        System.out.println("验签:" + checkMd5Token(md5Token, slat));
//        Thread.sleep(1000 * 100);
//        System.out.println("验签:" + checkMd5Token(md5Token, slat));

    }
}